#include "stdio.h"
int main(int argc, char const *argv[])
{

    // 位运算是直接与二进制运算。
    int a = 7; // 0111
    int b = 9; // 1001

    int c = a & b; // 1; 0001
    c = a | b;     // 15;1111

    /**
     * a & b
     * 0111
     * &
     * 1001
     * ====
     * 0001
     *
     * a | b
     * 0111
     * |
     * 1001
     * ====
     * 1111 (15)
     *
     *
     *
     *
     */

    // 逻辑与。
    // 两边都不为0，结果为1
    // int a = 1;
    // int b = 2;
    // int c = a && b; // c = 1;

    // // 逻辑或。
    // // 两边有一个非0，结果为1
    // int d = 0 || 1; // d = 1;

    // int e = 123;
    // int n = !e; // n = 0;
    // int v = !n; // v = 1;

    // 补码性质。0 1  -
    //  2 ^ 8 ; 0000 0000; 1111 1111 (2^8 - 1)
    //  假设计算机只有一位。
    //  它可以是0，也可以是1。它可以表示两个数字
    // 呢么假设计算机有两位
    // 它可以表示 00、01、10、11.这是四个数字
    // 数据有几位，就能代表2^n次幂个数字。

    // 原码：0010 1101（45）1010 1101（-45）(-127-127)
    // 反码：0010 1101（45）1101 0010（-45）
    // 补码：0010 1101（45）1101 0011 （-45）

    // 0的补码还是0。  1111 1111 + 1 = 0
    // 1的补码， 0000 0001， 1111 1110 + 1 = 1111 1111（-1）

    // 0000 0000； 1111 1111
    // 0111 1111(127) 1000 0000 (-127)(-127 - 127)255

    // 负数，代表零，去减去一个数字。
    // 但是0无法再次减去一个数字，
    // 这时候，我们令他从最高位借出一个1
    // 0 - 1=
    // 0000 0000 - 0000 0001
    // 1 0000 0000 - 0000 0001;

    // 1111 1111(-1)这才是实际的概念。

    return 0;
}